home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume25 / iozone / part01 next >
Encoding:
Text File  |  1991-11-11  |  24.9 KB  |  854 lines

  1. Newsgroups: comp.sources.misc
  2. From: norcott_bill@tandem.com (Bill Norcott)
  3. Subject:  v25i042:  iozone - sequential file I/O benchmark, v1.12, Part01/01
  4. Message-ID: <1991Nov10.210241.24342@sparky.imd.sterling.com>
  5. X-Md4-Signature: 07c4c3db1cb2bef13d0aced1c29ed664
  6. Date: Sun, 10 Nov 1991 21:02:41 GMT
  7. Approved: kent@sparky.imd.sterling.com
  8.  
  9. Submitted-by: norcott_bill@tandem.com (Bill Norcott)
  10. Posting-number: Volume 25, Issue 42
  11. Archive-name: iozone/part01
  12. Environment: AIX, BSD, HP-UX, MS-DOS, POSIX, SVR3.2, ULTRIX, UNIX, VMS
  13. Supersedes: iozone: Volume 22, Issue 29
  14.  
  15. This is version V1.12 of my IOzone benchmark, which tests the speed of 
  16. sequential file I/O on your system.   It reads and writes files of 
  17. various sizes and prints the read and write rates in bytes-per-second.
  18.  
  19. IOzone is portable and runs on MS-DOS and VMS, and also many variants of
  20. UNIX, including "plain vanilla" BSD and SVR3.2 as well as many vendor-
  21. specific flavors of UNIX.
  22.  
  23. For V1.12  the following features have been added to IOzone:
  24.  
  25.     * Support for Tandem NonStop-UX
  26.  
  27.     * Support for MIPS RISCos
  28.  
  29.     * IOzone is now a "Strictly Conforming POSIX.1 Application".  It will
  30.       run on any system which supports IEEE Std POSIX 1003.1-1988
  31.  
  32. I appreciate your comments on IOzone, please send to:
  33.  
  34.     norcott_bill@tandem.com        -- note the change of address
  35.  
  36. Regards,
  37. Bill Norcott
  38.  
  39. --------------------------------CUT HERE-------------------------------------
  40. #! /bin/sh
  41. #
  42. # This is a shell archive.  Save this into a file, edit it
  43. # and delete all lines above this comment.  Then give this
  44. # file to sh by executing the command "sh file".  The files
  45. # will be extracted into the current directory owned by
  46. # you with default permissions.
  47. #
  48. # The files contained herein are:
  49. #
  50. # -rw-r--r--   1 bill     100         1018 Nov  6 17:20 AAREADME
  51. # -rw-r--r--   1 bill     posix      20802 Nov  6 13:21 iozone.c
  52. #
  53. echo 'x - AAREADME'
  54. if test -f AAREADME; then echo 'shar: not overwriting AAREADME'; else
  55. sed 's/^X//' << '________This_Is_The_END________' > AAREADME
  56. XSubmitted-by: norcott_bill@tandem.com (Bill Norcott)
  57. XArchive-name: iozone/part01
  58. XEnvironment: AIX, BSD, HP-UX, MS-DOS, POSIX, SVR3.2, ULTRIX, UNIX, VMS, etc. 
  59. X
  60. XThis is version V1.12 of my IOzone benchmark, which tests the speed of 
  61. Xsequential file I/O on your system.   It reads and writes files of 
  62. Xvarious sizes and prints the read and write rates in bytes-per-second.
  63. X
  64. XIOzone is portable and runs on MS-DOS and VMS, and also many variants of
  65. XUNIX, including "plain vanilla" BSD and SVR3.2 as well as many vendor-
  66. Xspecific flavors of UNIX.
  67. X
  68. XFor V1.12  the following features have been added to IOzone:
  69. X
  70. X    * Support for Tandem NonStop-UX
  71. X
  72. X    * Support for MIPS RISCos
  73. X
  74. X    * IOzone is now a "Strictly Conforming POSIX.1 Application".  It will
  75. X      run on any system which supports IEEE Std POSIX 1003.1-1988
  76. X
  77. XI appreciate your comments on IOzone, please send to:
  78. X
  79. X    norcott_bill@tandem.com        -- note the change of address
  80. X
  81. XRegards,
  82. XBill Norcott
  83. X
  84. X---------------------   CUT HERE -----------------------------------------
  85. ________This_Is_The_END________
  86. if test `wc -l < AAREADME` -ne 29 ; then
  87.     echo 'shar: AAREADME was damaged during transit (should have been 29  bytes)'
  88. fi
  89. fi        ; : end of overwriting check
  90. echo 'x - iozone.c'
  91. if test -f iozone.c; then echo 'shar: not overwriting iozone.c'; else
  92. sed 's/^X//' << '________This_Is_The_END________' > iozone.c
  93. Xchar *help[] = {
  94. X"    'IO Zone' Benchmark Program",
  95. X" ",
  96. X"    Author:    Bill Norcott (norcott_bill@tandem.com)",
  97. X"        1060 Hyde Avenue",
  98. X"        San Jose, CA  95129",
  99. X" ",
  100. X"  Copyright 1991,   William D. Norcott",
  101. X"  License to freely use and distribute this software is hereby granted ",
  102. X"  by the author, subject to the condition that this copyright notice ",
  103. X"  remains intact.  The author retains the exclusive right to publish ",
  104. X"  derivative works based on this work, including, but not limited, ",
  105. X"  to revised versions of this work",
  106. X" ",
  107. X"  This test writes a 4 MEGABYTE sequential file in 512 byte chunks, then",
  108. X"  rewinds it  and reads it back.  [The size of the file should be",
  109. X"  big enough to factor out the effect of any disk cache.]",
  110. X"        ",
  111. X"  The file is written (filling any cache buffers), and then read.  If the",
  112. X"  cache is >= 4 MB, then most if not all the reads will be satisfied from",
  113. X"  the cache.  However, if it is less than or equal to 2 MB, then NONE of",
  114. X"  the reads will be satisfied from the cache.  This is becase after the ",
  115. X"  file is written, a 2 MB cache will contain the upper 2 MB of the test",
  116. X"  file, but we will start reading from the beginning of the file (data",
  117. X"  which is no longer in the cache)",
  118. X"        ",
  119. X"     NOTE: as of V1.04 default file size is now 1 MB not 4 MB",
  120. X"        ",
  121. X"  In order for this to be a fair test, the length of the test file must",
  122. X"  be AT LEAST 2X the amount of disk cache memory for your system.  If",
  123. X"  not, you are really testing the speed at which your CPU can read blocks",
  124. X"  out of the cache (not a fair test)",
  125. X"        ",
  126. X"  IOZONE does NOT test the raw I/O speed of your disk or system.  It",
  127. X"  tests the speed of sequential I/O to actual files.  Therefore, this",
  128. X"  measurement factors in the efficiency of you machines file system,",
  129. X"  operating system, C compiler, and C runtime library.  It produces a ",
  130. X"  measurement which is the number of bytes per second that your system",
  131. X"  can read or write to a file.  ",
  132. X" ",
  133. X"  For V1.06, IOZONE adds the 'auto test' feature.  This is activated",
  134. X"  by the command:  'iozone auto' .  The auto test runs IOZONE repeatedly  ",
  135. X"  using record sizes from 512 to 8192 bytes, and file sizes from 1 to 16",
  136. X"  megabytes.  It creates a table of results.",
  137. X"        ",
  138. X"  For V1.06, IOZONE lets you specify the number of file system sizes and      ",
  139. X"  record lengths to test when using auto mode.  Define the constants",
  140. X"  MEGABYTES_ITER_LIMIT and RECLEN_ITER_LIMIT as seen below      ",
  141. X"        ",
  142. X"  For V1.09 you can show the development help by typing 'iozone help'",
  143. X"        ",
  144. X"  For V1.10 IOzone traps SIGINT (user interrupt) and SIGTERM",
  145. X"  (kill from shell) signals and deletes the temporary file",
  146. X"        ",
  147. X"  For V1.11 IOzone requires no compilation flags for AIX",
  148. X"  Also, come miscellaneous cleanups have been made to the source",
  149. X"        ",
  150. X"  For V1.12 IOzone support has been added for the MIPS RISCos,",
  151. X"  Tandem Non-StopUX, and Tandem GUARDIAN 90 operating systems.",
  152. X"  IOzone is now a 'Conforming POSIX.1 Application'  (IEEE Std 1003.1-1988)   ",
  153. X"        ",
  154. X"  This program has been ported and tested on the following computer",
  155. X"  operating systems:",
  156. X" ",
  157. X"    Vendor        Operating System    Notes on compiling IOzone",
  158. X"    -------------------------------------------------------------------------",
  159. X"    Convergent        Unisys/AT&T Sys5r3  cc -DCONVERGENT -o iozone iozone.c",
  160. X"    Digital Equipment    ULTRIX V4.1 ",    
  161. X"    Digital Equipment    VAX/VMS V5.4        see below **     ",
  162. X"    Digital Equipment    VAX/VMS (POSIX) ",
  163. X"    Hewlett-Packard    HP-UX 7.05",
  164. X"    IBM            AIX Ver. 3 rel. 1",
  165. X"    Microsoft        MS-DOS 3.3        tested Borland, Microsoft C",
  166. X"    MIPS        RISCos 4.52",
  167. X"    OSF            OSF/1",
  168. X"    Portable!        POSIX 1003.1-1988",
  169. X"    SCO            UNIX System V/386 3.2.2",
  170. X"    SCO            XENIX 3.2",
  171. X"    Silicon Graphics    UNIX            cc -DSGI -o iozone iozone.c",
  172. X"    Sun Microsystems    SUNOS 4.1.1",
  173. X"    Tandem Computers    GUARDIAN 90",
  174. X"    Tandem Computers    Non-Stop UX",
  175. X"        ",
  176. X"    ** for VMS, define iozone as a foreign command via this DCL command:       ",
  177. X" ",
  178. X"     $IOZONE :== $SYS$DISK:[]IOZONE.EXE      ",
  179. X" ",
  180. X"     this lets you pass the command line arguments to IOZONE",
  181. X" ",
  182. X"  Acknowledgements to the following persons for their feedback on IOzone:       ",
  183. X" ",
  184. X"  Andy Puchrik, Michael D. Lawler, Krishna E. Bera, Sam Drake, John H. Hartman, ",
  185. X"  Ted Lyszczarz, Bill Metzenthen, Jody Winston, Clarence Dold",
  186. X"        ",
  187. X"  --- MODIFICATION HISTORY:",
  188. X" ",
  189. X" ",
  190. X"    3/7/91 William D. Norcott (Bill.Norcott@nuo.mts.dec.com)",
  191. X"         created",
  192. X" ",
  193. X"    3/22/91 Bill Norcott        tested on OSF/1 ... it works",
  194. X" ",
  195. X"    3/24/91 Bill Norcott        V1.02 -- use calloc in TURBOC to",
  196. X"                     fix bug with their malloc",
  197. X" ",
  198. X"    3/25/91 Bill Norcott        V1.03 -- add ifdef for XENIX",
  199. X"                     ",
  200. X"    3/27/91 Bill Norcott    V1.04 -- Includes for SCO UNIX",
  201. X"                     ",
  202. X"    4/26/91 Bill Norcott    V1.05 -- support AIX and SUNos, check",
  203. X"                     length of read() and write()",
  204. X"    4/26/91 Bill Norcott    V1.06 -- tabulate results of a series ",
  205. X"                     of tests",
  206. X"    5/17/91 Bill Norcott    V1.07 -- use time() for VMS",
  207. X"    5/20/91 Bill Norcott    V1.08 -- use %ld for Turbo C and",
  208. X"                     use #ifdef sun to bypass",
  209. X"                     inclusion of limits.h",
  210. X"    6/19/91 Bill Norcott    V1.09 -- rid #elif to support HP-UX and ",
  211. X"                     Silicon Graphics UNIX, and",
  212. X"                     add #ifdef SGI",
  213. X"                     add #ifdef CONVERGENT",
  214. X"                    for Convergent Technologies",
  215. X"                     also add help option",
  216. X"    7/2/91 Bill Norcott        V1.10 -- delete file if get SIGINT",
  217. X"                     or SIGTERM",
  218. X"    8/20/91 Bill Norcott        V1.11 -- require no flags with AIX",
  219. X"    11/4/91 Bill Norcott        V1.12 -- support MIPS RISCos",
  220. X"                                         Tandem NonStop-UX, and",
  221. X"                         IEEE Std POSIX 1003.1-1988",
  222. X"" };
  223. X/******************************************************************
  224. X    INCLUDE FILES (system-dependent)
  225. X******************************************************************/
  226. X/* V1.12 -- Include following line before any includes, to test for POSIX */
  227. X#define _POSIX_SOURCE
  228. X/* 
  229. Xdefine nolimits if your system has no limits.h.  Sun's don't but I
  230. Xtake care of this explicitly beginning with V1.08 of IOzone.
  231. X*/
  232. X#ifdef sun
  233. X#define nolimits
  234. X#define BSDtime
  235. X#endif
  236. X/* V1.09 -- Silicon Graphics compile with -DSGI  */
  237. X#ifdef SGI
  238. X#define nolimits
  239. X#define BSDtime
  240. X#endif
  241. X
  242. X/* V1.12 -- test for POSIX-conformant operating system; requires limits.h */
  243. X#ifndef nolimits
  244. X#include <limits.h>
  245. X
  246. X#ifdef _POSIX_ARG_MAX
  247. X#define isposix
  248. X#endif
  249. X
  250. X#endif
  251. X
  252. X/* Tandem's GUARDIAN operating system */
  253. X#include <stdio.h>
  254. X#ifdef __TANDEM
  255. X#define nosignals
  256. X#define noclock
  257. X#define ANSI_MAIN
  258. X#include <fcntl.h>
  259. X#include <stdlib.h>
  260. X#include <string.h>
  261. X#endif
  262. X#ifndef nosignals
  263. X#include <signal.h>
  264. X#endif
  265. X#ifdef    __MSDOS__        /* Turbo C define this way for PCs... */
  266. X#define    MSDOS            /* Microsoft C defines this */
  267. X#endif
  268. X/* VMS and MS-DOS both have ANSI C compilers and use rand()/srand() */
  269. X#ifdef    VMS_POSIX
  270. X#undef   VMS
  271. X#define    ANSI_RANDOM    1
  272. X#endif
  273. X#ifdef    MSDOS
  274. X#define    ANSI_RANDOM    1
  275. X#endif
  276. X/* Convergent Technologies M680xx based with Unisys/AT&T Sys5r3 */
  277. X#ifdef CONVERGENT
  278. X#include <fcntl.h>
  279. X#define SysVtime
  280. X#endif 
  281. X/* incl definitions of O_* flags for XENIX */
  282. X#ifdef M_XENIX
  283. X#include <fcntl.h>
  284. X#endif
  285. X/* SCO Unix System V */
  286. X#ifdef M_UNIX
  287. X#include <sys/types.h>
  288. X#include <sys/fcntl.h>
  289. X#endif
  290. X
  291. X/* V1.11 -- With the following includes, AIX no longer requires -Dunix */
  292. X#ifdef _AIX
  293. X#include <fcntl.h>
  294. X#include <sys/time.h>
  295. X#endif
  296. X/* For MIPS RISC/OS */ 
  297. X#ifdef SYSTYPE_SYSV
  298. X#define SysVtime
  299. X#include <sys/types.h>
  300. X#include <sys/times.h>
  301. X#include <sys/fcntl.h>
  302. X#endif
  303. X#if defined(VMS)
  304. X#define    ANSI_RANDOM    1
  305. X#include    <math.h>
  306. X#include    <unixio.h>
  307. X#include    <ssdef.h>
  308. X#include    <file.h>
  309. X#include    <time.h>
  310. X#else
  311. X/* ... either MSDOS, POSIX, or a generic non-POSIX UNIX */
  312. X#ifdef MSDOS
  313. X/* #elif defined(MSDOS) */
  314. X#include <fcntl.h>
  315. X#include <time.h>
  316. X#endif
  317. X/* nope, not MS-DOS, try POSIX */
  318. X#ifdef isposix
  319. X#include <time.h>
  320. X#include <sys/times.h>
  321. X#include <fcntl.h>
  322. X#else
  323. X#ifdef unix
  324. X#include <sys/file.h>
  325. X#endif
  326. X#endif
  327. X
  328. X#endif
  329. X
  330. X/* Define NULL in case we don't have it... */
  331. X#ifndef NULL
  332. X#define NULL 0
  333. X#endif
  334. X
  335. X/* for systems with System V-style time, define SysVtime */
  336. X#ifdef M_SYSV
  337. X#define SysVtime
  338. X#endif
  339. X#ifdef SysVtime
  340. X#include <sys/times.h>
  341. X#include <sys/param.h>
  342. X#ifndef CLK_TCK
  343. X#define CLK_TCK HZ
  344. X#endif
  345. X#endif
  346. X/* for systems with BSD style time, define BSDtime */
  347. X#ifdef bsd4_2
  348. X#define BSDtime
  349. X#endif
  350. X#ifdef BSDtime
  351. X#include <sys/time.h>
  352. X#endif
  353. X/******************************************************************
  354. X    DEFINED CONSTANTS
  355. X******************************************************************/
  356. X#define MEGABYTES 1            /* number of megabytes in file */
  357. X#define RECLEN 512            /* number of bytes in a record */
  358. X#define FILESIZE 1048576        /*size of file in bytes*/
  359. X#define NUMRECS 2048            /* number of records */
  360. X#define MAXBUFFERSIZE 16*1024        /*maximum buffer size*/
  361. X#define MINBUFFERSIZE 128
  362. X#define TOOFAST 10
  363. X#define IOZONE_USAGE \
  364. X "\tUsage:\tiozone [megabytes] [record_length_in_bytes] [[path]filename]\n\t\tiozone auto\n\t\tiozone help\n\n"
  365. X#define THISVERSION "V1.12"
  366. X/* Define only one of the following two.  All modern operating systems
  367. Xhave time functions so let TIME be defined */
  368. X#ifndef noclock
  369. X#define TIME 1
  370. X#endif
  371. X
  372. X#define MAXNAMESIZE 1000                /* max # of characters in filename */
  373. X#define CONTROL_STRING1 "\t%-8ld%-8ld%-20ld%-20ld\n"
  374. X#define CONTROL_STRING2 "\t%-8s%-8s%-20s%-20s\n"
  375. X/* 
  376. X    For 'auto mode', these defines determine the number of iterations
  377. X    to perform for both the file size and the record length.
  378. X    I.e., if MEGABYTES_ITER_LIMIT = 5 use 1, 2, 4, 8 & 16 megabyte files
  379. X    if RECLEN_ITER_LIMIT = 5 use 512, 1024, 2048, 4096 & 8192 byte records
  380. X*/ 
  381. X#define MEGABYTES_ITER_LIMIT 5
  382. X#define RECLEN_ITER_LIMIT 5
  383. X/******************************************************************
  384. X    FUNCTION DECLARATIONS
  385. X******************************************************************/
  386. Xvoid auto_test();        /* perform automatic test series */
  387. Xvoid show_help();        /* show development help*/
  388. Xstatic double time_so_far();    /* time since start of program */
  389. Xvoid signal_handler();        /* clean up if user interrupts us */
  390. X/******************************************************************
  391. X    GLOBAL VARIABLES
  392. X******************************************************************/
  393. Xint auto_mode;
  394. Xchar filename [MAXNAMESIZE];            /* name of temporary file */
  395. X/******************************************************************
  396. X    MAIN -- entry point
  397. X******************************************************************/
  398. X#ifdef ANSI_MAIN  
  399. Xint main(int argc, char *argv[], char *env[])    /* main body of code */
  400. X#else
  401. Xmain(argc,argv) 
  402. X      int argc;
  403. X     char *argv[];
  404. X#endif
  405. X{
  406. X#ifdef ANSI_MAIN  
  407. X  char *fooenv;
  408. X#endif
  409. Xint fd;
  410. Xchar *default_filename;
  411. X
  412. X#ifdef    MSDOS
  413. Xchar *buffer; 
  414. X#else
  415. Xchar buffer [MAXBUFFERSIZE];        /*a temporary data buffer*/
  416. X#endif
  417. Xint i;
  418. Xunsigned long megabytes = MEGABYTES;
  419. Xunsigned long reclen = RECLEN;
  420. Xunsigned long filesize = (unsigned long) FILESIZE;
  421. Xunsigned long numrecs = (unsigned long) NUMRECS;
  422. X#ifdef TIME
  423. Xunsigned long filebytes;
  424. Xunsigned long readrate, writerate;
  425. Xunsigned long goodmegs;
  426. Xunsigned long goodrecl;
  427. Xdouble starttime1, starttime2;
  428. Xdouble writetime, readtime;
  429. Xdouble totaltime;
  430. X#endif
  431. X#ifdef MSDOS
  432. X  buffer = (char *) calloc(1, MAXBUFFERSIZE);
  433. X#endif
  434. X
  435. X#if defined (ANSI_MAIN)
  436. X  fooenv= env[0];    /* dummy so we make some use of env (to avoid warnings) */
  437. X#endif
  438. X
  439. X
  440. X#if defined (__TANDEM) 
  441. X  default_filename ="IOZONET"; /* TANDEM GUARDIAN 90 has max 8 char filenames */
  442. X#else
  443. X  default_filename ="iozone.tmp"; /*default name of temporary file*/
  444. X#endif
  445. X  if (!auto_mode)
  446. X  {
  447. X    printf("\n\tIOZONE: Performance Test of Sequential File I/O  --  %s\n",
  448. X          THISVERSION);
  449. X    printf("\t\tBy Bill Norcott\n\n");
  450. X#ifndef nosignals
  451. X    signal(SIGINT, signal_handler);     /* handle user interrupt */
  452. X    signal(SIGTERM, signal_handler);     /* handle kill from shell */
  453. X#endif
  454. X  }
  455. X  strcpy(filename,default_filename);
  456. X  switch (argc) {
  457. X    case 1:       /* no args, take all defaults */
  458. X      printf(IOZONE_USAGE);
  459. X    break;
  460. X    case 2:     /* <megabytes|filename> */
  461. X    i = atoi(argv[1]); if (i) {
  462. X      megabytes = i;
  463. X    } else {
  464. X/*
  465. X'Auto mode' will be enabled if the first command line argument is
  466. Xthe word 'auto'.  This will trigger a series of tests
  467. X*/
  468. X      if ( (strcmp(argv[1], "auto") == 0) || 
  469. X           (strcmp(argv[1], "AUTO") == 0) )
  470. X      {
  471. X        auto_mode = 1;
  472. X        auto_test();
  473. X        printf("Completed series of tests\n");
  474. X        exit(0);
  475. X      } else {
  476. X        auto_mode = 0;
  477. X      }
  478. X      if ( (strcmp(argv[1], "help") == 0) || 
  479. X           (strcmp(argv[1], "HELP") == 0) )
  480. X      {
  481. X        show_help();
  482. X        exit(0);
  483. X      }
  484. X      strcpy(filename,argv[1]);
  485. X        }
  486. X    break;
  487. X    case 3:     /* <megabytes> <reclen|filename> */
  488. X    megabytes = atoi(argv[1]);
  489. X    if (atoi(argv[2])) {
  490. X      reclen = atoi(argv[2]);
  491. X    } else {
  492. X      strcpy(filename,argv[2]);
  493. X    }
  494. X    break;
  495. X    case 4:     /* <megabytes> <reclen> <filename> */
  496. X    megabytes = atoi(argv[1]);
  497. X    reclen = atoi(argv[2]);
  498. X    strcpy(filename,argv[3]);
  499. X    break;
  500. X    default:
  501. X      printf("IOZONE: bad usage\n");
  502. X      printf(IOZONE_USAGE);
  503. X      exit(1);
  504. X  }
  505. X  if (!auto_mode)
  506. X  {
  507. X    printf("\tSend comments to:\tnorcott_bill@tandem.com\n\n");
  508. X  }
  509. X  filesize = megabytes*1024*1024;
  510. X  numrecs = filesize/reclen;
  511. X  if (reclen >  MAXBUFFERSIZE) {
  512. X    printf("<Error: Maximum record length is %d bytes\n", MAXBUFFERSIZE);
  513. X        exit(1);
  514. X    }
  515. X  if (reclen < MINBUFFERSIZE) {
  516. X    printf("Error: Minimum record length is %d bytes\n", MINBUFFERSIZE);
  517. X        exit(1);
  518. X    }
  519. X  if (!auto_mode)
  520. X  {
  521. X    printf("\tIOZONE writes a %ld Megabyte sequential file consisting of\n",
  522. X    megabytes);
  523. X    printf("\t%ld records which are each %ld bytes in length.\n",
  524. X    numrecs, reclen);
  525. X    printf("\tIt then reads the file.  It prints the bytes-per-second\n");
  526. X    printf("\trate at which the computer can read and write files.\n\n");
  527. X    printf("\nWriting the %ld Megabyte file, '%s'...", megabytes, filename);
  528. X  }  
  529. X
  530. X#if defined (__TANDEM)
  531. X/* 
  532. XTandem's GUARDIAN preallocates file space based on primary- and secondary extents.
  533. XThe last 2 parameters to open are the sizes of the primary- and secondary extents,
  534. Xin blocks which are 2K bytes each.  After the primary extent is filled, GUARDIAN
  535. Xallocates up to 15 additional extents, one at a time.
  536. X*/
  537. X#define SPECIAL_CREAT
  538. X#define PRI_EXT_BLOCKS 1024
  539. X#define SEC_EXT_BLOCKS 1024
  540. X    if((fd = creat(filename, 0640, 
  541. X              PRI_EXT_BLOCKS, SEC_EXT_BLOCKS))<0){
  542. X        printf("Cannot create temporary file: %s\n", filename);
  543. X        exit(1);
  544. X    }
  545. X#endif
  546. X#ifndef SPECIAL_CREAT
  547. X    if((fd = creat(filename, 0640))<0){
  548. X        printf("Cannot create temporary file: %s\n", filename);
  549. X        exit(1);
  550. X    }
  551. X#endif
  552. X#ifdef TIME
  553. X    starttime1 = time_so_far();
  554. X#endif
  555. X    for(i=0; i<numrecs; i++){
  556. X#ifndef DEBUG_ME
  557. X        if(write(fd, buffer, (unsigned) reclen) != reclen)
  558. X            {
  559. X            printf("Error writing block %d\n", i);
  560. X            perror("iozone");
  561. X            close(fd);
  562. X#ifndef VMS
  563. X            unlink(filename);    /* delete the file */
  564. X                    /*stop timer*/
  565. X#endif
  566. X            exit(1);
  567. X            }
  568. X#endif
  569. X    }
  570. X#ifdef TIME
  571. X    writetime = time_so_far() - starttime1;
  572. X    if (!auto_mode)
  573. X        {
  574. X        printf("%f seconds", writetime);
  575. X        }
  576. X#endif
  577. X    close(fd);
  578. X#if defined (VMS)
  579. X#define SPECIAL_OPEN_READ
  580. X    if((fd = open(filename, O_RDONLY, 0640))<0){
  581. X        printf("Cannot open temporary file for read\n");
  582. X        exit(1);
  583. X    }
  584. X#endif
  585. X
  586. X#ifdef MSDOS
  587. X#define SPECIAL_OPEN_READ
  588. X    if((fd = open(filename, O_RDONLY, 0640))<0){
  589. X        printf("Cannot open temporary file for read\n");
  590. X        exit(1);
  591. X    }
  592. X#endif
  593. X
  594. X/*
  595. X  'Generic' case, compiled if no operating system-specific case was invoked
  596. X*/
  597. X#ifndef SPECIAL_OPEN_READ
  598. X    if((fd = open(filename, O_RDONLY))<0){
  599. X        printf("Cannot open temporary file for read\n");
  600. X        exit(1);
  601. X       }
  602. X#endif
  603. X
  604. X            /*start timing*/
  605. X#ifndef TIME
  606. X    printf("start timing\n");
  607. X#endif
  608. X    if (!auto_mode)
  609. X    {
  610. X        printf("\nReading the file...");
  611. X    }
  612. X#ifdef TIME
  613. X        starttime2 = time_so_far();
  614. X#endif
  615. Xfor(i=0; i<numrecs; i++) {
  616. X#ifndef DEBUG_ME
  617. X  if(read(fd, buffer, (unsigned) reclen) != reclen)
  618. X    {
  619. X      printf("Error reading block %d\n", i);
  620. X      exit(1);
  621. X    }
  622. X#endif
  623. X    }
  624. X#ifndef TIME
  625. X    printf("stop timing\n");
  626. X#endif
  627. X#ifdef TIME
  628. X    readtime = time_so_far() - starttime2;
  629. X    if (!auto_mode)
  630. X    {
  631. X        printf("%f seconds\n", readtime);
  632. X    }
  633. X#ifdef DEBUG_ME
  634. X    readtime = 1;
  635. X    writetime = 1;
  636. X#endif
  637. X    if(readtime!=0)
  638. X    {   
  639. X        filebytes = numrecs*reclen;
  640. X        readrate = (unsigned long) ((double) filebytes / readtime);
  641. X        writerate = (unsigned long) ((double) filebytes / writetime);
  642. X        if (auto_mode)
  643. X        {
  644. X         printf(CONTROL_STRING1,
  645. X            megabytes, 
  646. X            reclen,
  647. X            writerate,
  648. X            readrate);
  649. X                    
  650. X        } else {
  651. X        printf("\nIOZONE performance measurements:\n");
  652. X        printf("\t%ld bytes/second for writing the file\n", writerate);
  653. X        printf("\t%ld bytes/second for reading the file\n", readrate);
  654. X        totaltime = readtime + writetime;
  655. X        if (totaltime < TOOFAST) 
  656. X        {
  657. X            goodmegs = (TOOFAST/totaltime)*2*megabytes;
  658. X            printf("\nThe test completed too quickly to give a good result\n");
  659. X            printf("You will get a more precise measure of this machine's\n");
  660. X            printf("performance by re-running IOZONE using the command:\n");
  661. X            printf("\n\tiozone %ld ", goodmegs);
  662. X            printf("\t(i.e., file size = %ld megabytes)\n", goodmegs);
  663. X        }
  664. X        }
  665. X    } else {
  666. X        goodrecl = reclen/2;
  667. X        printf("\nI/O error during read.  Try again with the command:\n");
  668. X        printf("\n\tiozone %ld %ld ", megabytes,  goodrecl);
  669. X        printf("\t(i.e. record size = %ld bytes)\n",  goodrecl);
  670. X    }
  671. X#endif
  672. X    close(fd);
  673. X#ifndef VMS
  674. X    unlink(filename);    /* delete the file */
  675. X                    /*stop timer*/
  676. X#endif
  677. X#ifdef    MSDOS
  678. X    free(buffer);        /* deallocate the memory */
  679. X#endif
  680. X#ifdef VMS
  681. Xreturn SS$_NORMAL;
  682. X#else
  683. Xreturn 0;
  684. X#endif
  685. X}
  686. X/******************************************************************
  687. X    SHOW_HELP -- show development help of this program
  688. X******************************************************************/
  689. Xvoid show_help()
  690. X{
  691. X    int i;
  692. X    printf("IOZONE: help mode\n\n");
  693. X    for(i=0; strlen(help[i]); i++)
  694. X    {
  695. X    printf("%s\n", help[i]);
  696. X    }
  697. X}
  698. X/******************************************************************
  699. X    SIGNAL_HANDLER -- clean up if user interrupts the program
  700. X******************************************************************/
  701. Xvoid signal_handler()
  702. X{
  703. X    printf("\nIOZONE: interrupted\n\n");
  704. X#ifndef VMS
  705. X    printf("deleting file: %s\n", filename);
  706. X    unlink(filename);    /* delete the file */
  707. X#endif
  708. X    printf("exiting IOzone\n\n");
  709. X    exit(0);
  710. X}
  711. X/******************************************************************
  712. X    AUTO_TEST -- perform series of tests and tabulate results
  713. X******************************************************************/
  714. Xvoid auto_test()
  715. X{
  716. X
  717. X    int megsi, recszi;
  718. X    char megs[10]; 
  719. X    char recsz[10];
  720. X    int i,j;
  721. X    int auto_argc = 3;
  722. X    char *auto_argv[3];
  723. X    
  724. X    printf("IOZONE: auto-test mode\n\n");
  725. X    printf(CONTROL_STRING2,
  726. X    "MB", 
  727. X    "reclen",
  728. X    "bytes/sec written",
  729. X    "bytes/sec read");
  730. X    auto_argv[0] = "IOzone auto-test";
  731. X    auto_argv[1] = megs;
  732. X    auto_argv[2] = recsz;
  733. X/*
  734. XStart with file size of 1 megabyte and repeat the test MEGABYTES_ITER_LIMIT
  735. Xtimes.  Each time we run, the file size is doubled
  736. X*/
  737. X    for(i=0,megsi=1;i<MEGABYTES_ITER_LIMIT;i++,megsi*=2) 
  738. X    {
  739. X    sprintf(megs, "%d", megsi);
  740. X/*
  741. XStart with record size of 512 bytes and repeat the test RECLEN_ITER_LIMIT
  742. Xtimes.  Each time we run, the record size is doubled
  743. X*/
  744. X    for (j=0,recszi=512;j<RECLEN_ITER_LIMIT;j++,recszi*=2)
  745. X    {
  746. X        sprintf(recsz, "%d", recszi);
  747. X#ifdef ANSI_MAIN
  748. X        main(auto_argc, auto_argv, NULL);
  749. X#else
  750. X        main(auto_argc, auto_argv);
  751. X#endif
  752. X    }
  753. X    }
  754. X}
  755. X#ifdef TIME
  756. Xstatic double
  757. Xtime_so_far()
  758. X{
  759. X#if defined(VMS)
  760. X/* 
  761. X*   5/17/91 Bill Norcott    V1.07 -- use time() for VMS
  762. XThe times() function in VMS returns proc & user CPU time in 10-millisecond
  763. Xticks.  Instead, use time() which lacks the precision but gives clock
  764. Xtime in seconds.
  765. X*/
  766. X  return (double) time(NULL);
  767. X#else
  768. X#ifdef isposix
  769. X  int        val;
  770. X  struct tms tms;
  771. X  if ((val = times(&tms)) == -1)
  772. X    perror("times");
  773. X  return ((double) val) / ((double) CLK_TCK);
  774. X#endif
  775. X#ifdef SysVtime
  776. X/* #elif defined(SysVtime) */
  777. X  int        val;
  778. X  struct tms tms;
  779. X  if ((val = times(&tms)) == -1)
  780. X    perror("times");
  781. X  return ((double) val) / ((double) CLK_TCK);
  782. X#endif
  783. X#if defined(MSDOS)
  784. X  return ((double) clock()) / ((double) CLK_TCK);
  785. X#endif
  786. X#ifndef MSDOS
  787. X#ifndef isposix
  788. X#ifndef SysVtime
  789. X/* #else */
  790. X  struct timeval tp;
  791. X  if (gettimeofday(&tp, (struct timezone *) NULL) == -1)
  792. X    perror("gettimeofday");
  793. X  return ((double) (tp.tv_sec)) +
  794. X    (((double) tp.tv_usec) / 1000000.0);
  795. X#endif
  796. X#endif
  797. X#endif
  798. X#endif
  799. X}
  800. X#endif
  801. X
  802. ________This_Is_The_END________
  803. if test `wc -l < iozone.c` -ne 747 ; then
  804.     echo 'shar: iozone.c was damaged during transit (should have been 747  bytes)'
  805. fi
  806. fi        ; : end of overwriting check
  807. exit 0
  808.  
  809.  
  810. exit 0 # Just in case...
  811. -- 
  812. Kent Landfield                   INTERNET: kent@sparky.IMD.Sterling.COM
  813. Sterling Software, IMD           UUCP:     uunet!sparky!kent
  814. Phone:    (402) 291-8300         FAX:      (402) 291-4362
  815. Please send comp.sources.misc-related mail to kent@uunet.uu.net.
  816.